#include "../log_all_files/log.h"
#include <chrono>
using namespace std;
/*基于同步单线程/多线程 异步单线程/多线程的测试*/

// 日志器名称 线程数量 日志条数 单条日志尺寸
void BenchMark(const string logname, size_t threadsize, size_t msg_nums, size_t msg_size)
{

    Logger::lptr logger = GetLogger(logname);
    if (!logger.get())
        return;
    string msg(msg_size, '1');
    vector<thread> threads;
    vector<double> T(threadsize); // 方便后期使用
    cout << "输入线程数量: " << threadsize << std::endl;
    cout << "输出日志数量: " << msg_nums << std::endl;
    cout << "输出日志大小: " << msg_size * msg_nums / 1024 << "KB" << std::endl;

    // 计算每个线程需要跑的日志数量：
    size_t avgmsg = msg_nums / threadsize;
    for (int i = 0; i < threadsize; i++)
    {

        threads.emplace_back([&,i]() //这里i不能变确保每个线程对应的编号与T匹配-->否则可能越界访问
                             {
                                 auto start = chrono::high_resolution_clock::now();
                                 for (int j = 0; j < avgmsg; j++)
                                 {
                                     logger->Info("%s",msg);
                                     
                                 }
                                auto end = chrono::high_resolution_clock::now();
                                     auto timegap = chrono::duration_cast<chrono::duration<double>>(end - start); // 精确秒数
                                     T[i] = timegap.count();
                                     std::cout << "线程" << i << "耗时: " << timegap.count() << "s" << " 平均：" << avgmsg / timegap.count() << "/s\n"; });
    }
    for (auto &a : threads)
    {
        a.join();
    }
    double max_time = T[0];

    for (auto a : T)
        max_time = a >= max_time ? a : max_time;

    cout << "总消耗时间: " << max_time << endl;
    cout << "平均每秒输出: " << (size_t)(msg_nums / max_time) << "条日志" << endl;
    cout << "平均每秒输出: " << (size_t)(msg_size * msg_nums / max_time / 1024 / 1024) << "MB" << endl;
}


int main()
{

    Loggerbuilder::ptr gptr = std::make_shared<Globalloggerbuilder>();
    gptr->Buildloggername("test");                    // 日志器名称
    gptr->Buildloggertype(Loggertype::LOGGER_ASYNC);   // 日志器类型（同步还是异步）
    gptr->Buildloopertype(AsyncIsSafe::ASYNC_UNSAFE); // 异步日志器才能选择的是缓冲区安全版本还是不安全版本  防止不必要阻塞发生选择非安全测试模式
    gptr->Buildformmater("%m");                       // 日志输出格式
    gptr->Buildlimitlevel(Level::LevelType::INFO);    // 日志等级（只会输出高于它的日志）
    // 注册日志落地方式
    // gptr->Buildlogsinks<Stdoutsink>();
    gptr->Buildlogsinks<Filesink>("./l/test.log");
    // gptr->Buildlogsinks<Rollfilesink>("./l/roll-", 1024);

    gptr->Build(); // 组合日志组件+添加进loggermanager里

    BenchMark("test", 1, 100000, 10000);
    BenchMark("test", 5, 100000, 10000);
    //基于同步单线程/多线程 异步单线程/多线程的测试
}